package main

import (
	"fmt"
	"time"
)

func worker1(ready chan struct{}) {
	fmt.Println("worker1 开始准备...")
	fmt.Println("worker1 准备完毕，等待worker2...")
	<-ready // ① worker1在此阻塞，等待接收信号
	fmt.Println("worker1 开始执行！")
}

func worker2(ready chan struct{}) {
	time.Sleep(time.Second)
	fmt.Println("worker2 开始准备...")
	fmt.Println("worker2 准备完毕，通知worker1...")
	ready <- struct{}{} // ② worker2在此阻塞，等待发送信号
	fmt.Println("worker2 开始执行！")
}

func main() {
	ready := make(chan struct{}) // 创建无缓冲通道

	go worker1(ready)
	go worker2(ready)

	// 让主协程休眠一段时间，等待其他协程执行
	// 注意：这里即使增加休眠时间也无法避免死锁
	// 因为两个worker协程已经互相阻塞
	//select {} // 让主协程永远阻塞，等待其他协程执行
	time.Sleep(2 * time.Second)
}
